/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica;

import cern.jet.random.Normal;
import cern.jet.random.engine.DRand;
import cern.jet.random.engine.RandomEngine;
import java.util.ArrayList;
import java.util.concurrent.Semaphore;
import javax.swing.JLabel;

/**
 *
 * @author Jorge Maldonado
 */
public class servicio extends JLabel implements Runnable {

    private int clientesAtendidos;
    private boolean vivo;
    private double tiempoServicio;
    private Thread hilo;
    private Semaphore sem;
    private persona atendida;
    private ArrayList<persona> cola;
    private javax.swing.JPanel panel,panel2;
    private String nombre;

    public servicio(double tiempoServicio, ArrayList cola,String nombre) {//4
        setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/clientes/registrer.png")));
        clientesAtendidos = 0;
        setText(nombre+": "+Integer.toString(clientesAtendidos));
        this.cola = cola;
        vivo = true;
        this.nombre=nombre;
        this.tiempoServicio = tiempoServicio;
        hilo = new Thread(this);
        sem = new Semaphore(0, true);
        
        general.hilos.add(hilo);
        hilo.start();
    }

    public void setPanel(javax.swing.JPanel panel) {
        this.panel = panel;
    }
    
    public void setPanel2(javax.swing.JPanel panel) {
        this.panel2 = panel;
    }
    public double normal() {
        RandomEngine engine = new DRand();
        Normal normal = new Normal(1 / tiempoServicio, Math.sqrt(1 / tiempoServicio), engine);
        return normal.nextDouble();
    }

    public void run() {
        int tiempo = 1;
        double lim;
        while (isVivo()) {
            try {
                setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/clientes/registrer.png")));
                general.hay_gente.acquire();
                general.exc_mut.acquire();
                setPersona(cola.get(0));
                cola.remove(0);
                /*evento de llevar gente al servicio--------------------*/
                /*------------------------------------------------------*/
                general.exc_mut.release();
                general.limiteFila.release();
                atendida.sem2.acquire();
                panel2.add(atendida);
                atendida.sale_cola();
                lim = normal();
                setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/clientes/atendiendo.png")));
                while (tiempo <= lim) {
                    tiempo++;
                    Thread.sleep(general.velocidad);
                    while(logica.general.pausa){
                    Thread.sleep(100);
                }
                }
                tiempo = 0;
                setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/clientes/registrer.png")));
                general.todos.add(getAtendida());
                getAtendida().setTiempoServicio(lim);
                atendida.sem2.acquire();
                panel.add(atendida);
                getAtendida().terminar();
                clientesAtendidos++;
                setText(nombre+": "+Integer.toString(clientesAtendidos));
                atendida = null;
                while(logica.general.pausa){
                    Thread.sleep(100);
                }
            } catch (Exception ev) {
            }
        }
    }

    public void atender() {
        sem.release();

    }

    /**
     * @return the clientesAtendidos
     */
    public int getClientesAtendidos() {
        return clientesAtendidos;
    }

    /**
     * @return the vivo
     */
    public boolean isVivo() {
        return vivo;
    }

    /**
     * @return the tiempoServicio
     */
    public double getTiempoServicio() {
        return tiempoServicio;
    }

    /**
     * @param tiempoServicio the tiempoServicio to set
     */
    public void setTiempoServicio(int tiempoServicio) {
        this.tiempoServicio = tiempoServicio;
    }

    public void matar() {
        vivo = false;
    }

    public void setPersona(persona per) {
        atendida = per;
    }

    /**
     * @return the atendida
     */
    public persona getAtendida() {
        return atendida;
    }
}
